package ml.kupin.cart.controller;

import com.alibaba.fastjson.JSON;
import ml.kupin.cart.service.CartService;
import ml.kupin.common.utils.CookieUtils;
import ml.kupin.common.utils.KuPinResult;
import ml.kupin.pojo.TbItem;
import ml.kupin.pojo.TbUser;
import ml.kupin.service.ItemService;
import org.apache.commons.lang3.StringUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.http.MediaType;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.*;

import javax.print.attribute.standard.Media;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.util.ArrayList;
import java.util.List;

/**
 * Created by 小柯(Allen Kerr) on 17.5.6 20:15.
 */
@RequestMapping("/cart")
@Controller
public class CartController {

    @Autowired
    private ItemService itemService;
    @Autowired
    private CartService cartService;

    @Value("${cart_cookie_name}")
    private String cart_cookie_name;
    @Value("${cart_cookie_lifetime}")
    private int cart_cookie_lifetime;

    /**
     * 购物车页面
     * 1. 用户已登录：合并cookie中的购物车列表到redis中去，然后从redis中取购物车列表
     * 2. 用户未登录：从cookie中取购物车列表
     * 链接：http://localhost:8090/cart.html
     */
    @RequestMapping("")
    public String showCartPage(HttpServletRequest request, HttpServletResponse response) {
        //从cookie中取出购物车列表
        List<TbItem> cartItemList = getCartItemListFromCookie(request);
        //从request中取用户信息
        TbUser user = (TbUser) request.getAttribute("user");
        if (user != null) {
            //用户已登录
            if (cartItemList.size() > 0) {
                //把cookie中的购物车商品和服务端的购物车商品合并
                cartService.mergeCart(user.getId(), cartItemList);
                //把cookie中的购物车删除
                CookieUtils.deleteCookie(request, response, cart_cookie_name);
            }
            //从服务端取购物车列表
            cartItemList = cartService.getCartItemList(user.getId());
        }
        //添加到request域中
        request.setAttribute("cartList", cartItemList);
        //返回逻辑视图
        return "cart";
    }

    /**
     * 添加商品到购物车
     * 1. 用户已登录：添加到redis中
     * 2. 用户未登录：添加到cookie中
     * 链接：/cart/add/149388999403508.html?num=8
     */
    @RequestMapping(value = "/add/{itemId}", method = RequestMethod.GET)
    public String addItem2Cart(@PathVariable Long itemId, @RequestParam(defaultValue = "1") int num,
                               HttpServletRequest request, HttpServletResponse response) {
        //一、用户已登录
        TbUser user = (TbUser) request.getAttribute("user");
        if (user != null) {
            //1、 调用服务层，将商品添加到redis中与该用户对应的购物车列表中去
            cartService.addCartItem(user.getId(), itemId, num);
            //2、 返回逻辑视图
            return "cartSuccess";
        }

        //二、用户未登录，添加购物车到cookie中
        //1、 从 cookie 中查询商品列表。
        List<TbItem> cartItemList = getCartItemListFromCookie(request);
        //2、 判断商品在商品列表中是否存在。
        boolean flag_hasItem = false;
        for (TbItem item : cartItemList) {
            if (item.getId().longValue() == itemId) {
                //3、 如果存在，商品数量相加。
                item.setNum(item.getNum() + num);
                flag_hasItem = true;
                break;
            }
        }
        //4、 不存在，根据商品 id 查询商品信息。
        if (!flag_hasItem) {
            TbItem item = itemService.getItemById(itemId);
            //取一张图片
            String image = item.getImage();
            if (StringUtils.isNotBlank(image)) {
                item.setImage(image.split(",")[0]);
            }
            //设置商品数量
            item.setNum(num);
            //5、 把商品添加到购车列表。
            cartItemList.add(item);
        }
        //6、 把购车商品列表写入 cookie。
        CookieUtils.setCookie(request, response, cart_cookie_name, JSON.toJSONString(cartItemList),
                cart_cookie_lifetime, true);
        //7.返回逻辑视图
        return "cartSuccess";
    }

    /**
     * 从购物车中移除某件商品
     * 链接形式；http://localhost:8090/cart/delete/商品id.html
     */
    @RequestMapping(value = "/delete/{itemId}", method = RequestMethod.GET)
    public String deleteItemFromCart(@PathVariable Long itemId, HttpServletRequest request, HttpServletResponse response) {
        TbUser user = (TbUser) request.getAttribute("user");
        //用户已登录
        if (user != null) {
            cartService.deleteCartItem(user.getId(), itemId);
            //页面重定向
            return "redirect:/cart.html";
        }
        //用户未登录
        //从cookie中取商品列表
        List<TbItem> cartItemList = getCartItemListFromCookie(request);
        //从cartItemList中删除与itemId对应的商品
        for (TbItem item : cartItemList) {
            if (item.getId().longValue() == itemId) {
                cartItemList.remove(item);//删除
                break;//跳出循环
            }
        }
        //写回cookie
        CookieUtils.setCookie(request, response, cart_cookie_name, JSON.toJSONString(cartItemList),
                cart_cookie_lifetime, true);
        //页面重定向
        return "redirect:/cart.html";
    }

    /**
     * 增加或减少商品的数量，相应地更新存储在cookie中的cartItemList，以及页面显示的小计和总价
     * 方法在cart.js中，ajax请求，post形式，链接：/cart/updateNum/商品id/商品数量.action
     */
    @RequestMapping(value = "/updateNum/{itemId}/{itemNum}", method = RequestMethod.POST,
            produces = MediaType.APPLICATION_JSON_UTF8_VALUE)
    @ResponseBody
    public KuPinResult updateItemNum(@PathVariable Long itemId, @PathVariable Integer itemNum,
                                     HttpServletRequest request, HttpServletResponse response) {
        //排除 null 的影响
        if (itemId == null || itemNum == null) {
            return KuPinResult.notOk();
        }

        TbUser user = (TbUser) request.getAttribute("user");
        //用户已登录
        if (user != null) {
            KuPinResult kuPinResult = cartService.updateCartItemNum(user.getId(), itemId, itemNum);
            return kuPinResult;
        }

        //用户未登录
        //从cookie中取出购物车列表
        List<TbItem> cartItemList = getCartItemListFromCookie(request);
        //为与商品id对应的商品更新数量
        for (TbItem item : cartItemList) {
            if (item.getId().longValue() == itemId) {
                item.setNum(itemNum);
                break;
            }
        }
        //写回cookie
        CookieUtils.setCookie(request, response, cart_cookie_name, JSON.toJSONString(cartItemList), cart_cookie_lifetime);
        //返回
        return KuPinResult.ok();
    }

    /**
     * 提取一个公共的方法：从cookie中取出购物车列表
     *
     * @param request
     * @return
     */
    private List<TbItem> getCartItemListFromCookie(HttpServletRequest request) {
        //取出cookie中存储的购物车列表 ————> json字符串形式
        String cookieValue = CookieUtils.getCookieValue(request, cart_cookie_name, true);
        //判断是否为空，不为空才可以转换
        if (StringUtils.isNotBlank(cookieValue)) {
            //转换
            List<TbItem> cartItemList = JSON.parseArray(cookieValue, TbItem.class);
            return cartItemList;
        }
        //cookie中没有购物车列表，创建一个空集合返回
        return new ArrayList<>();
    }

}
